Skip to main content

6.2 Løkker

Løkker tar skrittet videre ved å la deg automatisere bruk av gjentakende kommandolinjer med lik struktur. F.eks. dersom du vil importere en variabel flere ganger med forskjellige måletidspunkt. Da kan du benytte kommandoen for i kombinasjon med in for å definere hvordan løkken skal itereres. Man kan enten definere et intervall gjennom bruk av et kolonntegn (:), eller du kan liste verdiene det skal itereres over. Det er mulig å bruke både heltall, tekst og symboler som iteratorer, og det er mulig å iterere over mer enn en iterator i en løkke. Iteratorer kan ses på som en binding som genererer et sett med verdier som går fra først til siste verdi i en løkke. Merk at iterator-bindinger er lokale slik at man kan bruke de samme navnene i ulike løkker. Også bindinger som defineres inni en løkke er lokale.

Eksempel på bruk av løkker:

 for iterator in 1 2 3
  let double = $iterator * 2
end

for iterator in 1:3
  let double = $iterator * 2
end

for år in 2019 : 2021
  let siv_dato = $år ++ "-01-01"
  let siv_år = siv_ ++ $år
  import f/SIVSTANDFDT_SIVSTAND $siv_dato as $siv_år
end
 

Et typisk analyseeksempel der man importerer av et sett med variabler målt over flere år, for et tilfeldig utvalg av bosatte individer i en gitt aldergruppe:

 let start_år = 2020
let start_dato = date_fmt($start_år + 1)

let minalder = 40
let maxalder = 50

create-dataset totalpop
import f/BEFOLKNING_FOEDSELS_AAR_MND as faarmnd
sample 0.1 12345
generate alder = $start_år - int(faarmnd/100)

import f/BEFOLKNING_STATUSKODE $start_dato as regstat

keep if regstat == '1' & alder >= $minalder & alder <= $maxalder
histogram alder, discrete freq

//Variant 1
for i in 2016 : 2020
  let idato = date_fmt($i, 12, 31)
  let yy = $i - 2000
  let var = lønn ++ $yy
  import f/INNTEKT_LONN $idato as $var
end

//Variant 2
for i in 2016 : 2020
  import f/INNTEKT_LONN date_fmt($i, 12, 31) as lønn ++ $i - 2000 ++ "_2"
end
 

Et annet eksempel der man lager tre datasett med lik struktur, og som henter ut forløpsdata målt over året 2018 for hhv. arbeidssøkere, uføre, og sosialhjelpsmottakere. Dette brukes til å finne antall dager i de ulike statusene (i løpet av 2018). Datasettene kobles sammen med hoveddatasettet "bosatte" for hvert trinn:

 for dbnavn, vnavn in ARBSOEK2001FDT_HOVED UFOERP2011FDT_GRAD SOSHJLPFDT_MOTTAK, arbsøk ufør sosial 
  create-dataset $vnavn ++ "data"
  import-event db/$dbnavn 2018-01-01 to 2018-12-31 as $vnavn

  let startvar = START@++$vnavn
  let stoppvar = STOP@++$vnavn
  let dagervar = $vnavn ++ "_dager"

  replace $stoppvar = date(2018,12,31) if $stoppvar > date(2018,12,31)
  replace $startvar = date(2018,01,01) if $startvar < date(2018,01,01)

  generate $dagervar = $stoppvar - $startvar + 1
  collapse(sum) $dagervar, by(PERSONID_1)
  boxplot $dagervar
  summarize $dagervar
  histogram $dagervar, width(30)
  merge $dagervar into bosatte
end
 

Nok et eksempel der man henter ut tverrsnittsdata over arbeidstid for alle arbeidstakere målt over alle månedene i 2018:

 create-dataset arbeidstaker

for i in 1 : 9
  import db/ARBLONN_PERS_SUM_ARBEIDSTID date_fmt(2018,0+$i,16) as arbtid0++$i, outer_join
end

for i in 10 : 12
  import db/ARBLONN_PERS_SUM_ARBEIDSTID date_fmt(2018,$i,16) as arbtid++$i, outer_join
end
 

NB! Merk at bruk av inline-bindinger (++) ikke er kompatibelt med kommandoen collapse(). Derfor bør du bruke bindinger gjennom bruk at let i forbindelse med collapse()-operasjoner.

Eksempel som ikke fungerer:

Bruk i stedet denne løsningen:

Komplett introduksjonsskript for bindinger og løkker [finner du her](docs\eksempel\Sammensatte operasjoner\Bruke bindinger og løkker.md) (kan limes inn i skriptvinduet i microdata.no og kjøres).

Praktisk eksempel der man kobler sammen søsken til et datasett ved bruk av løkker finner du her.